/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import MODEL.*;
import VIEW.ProjetoFinal;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 *
 * @author Rodrigo
 */
public class DaoItensVenda extends Banco{
    public DaoItensVenda(){
        connection=Conecta();
    }
    
    public void setItensVenda(ItensVenda itens, int cod_mesa){
        DaoVenda dv = new DaoVenda();
        Venda venda = dv.getVendas(cod_mesa);
        itens.setCod_Venda(venda.getCodigo());
        try {
            if(itens.getCod_Venda()!=0){
                ItensVenda itemVenda = getItemVenda(itens.getCod_Venda(), itens.getProduto().getCodigo());
               
                    String SQL = "INSERT INTO itens_venda VALUES(default,?,?,?,?,default,NOW(),?)";
                    PreparedStatement stmt = Conecta().prepareStatement(SQL);
                    
                    stmt.setInt(1, itens.getCod_Venda());
                    
                    stmt.setInt(2, itens.getProduto().getCodigo());
                    
                    stmt.setInt(3, itens.getQuantia());
                    
                    DaoProdutos dp = new DaoProdutos();
                    Produtos produto = dp.getProdutos(itens.getProduto().getCodigo());
                    if(produto.getQuantia()-itens.getQuantia()>=0){
                        produto.setQuantia(produto.getQuantia()-itens.getQuantia());
                        dp.Conecta();
                        dp.updateProduto(produto);

                        stmt.setDouble(4, itens.getValor_unitario());
                        stmt.setInt(5, ProjetoFinal.getInstance().getFuncionario().getCodigo());
                        stmt.execute();  
                    }else{
                        JOptionPane.showMessageDialog(null, "Não Foi Possivel Vender "+itens.getProduto().getNome()+", Para isso compre mais produtos e Insira no Estoque!");
                    }
                    stmt.close();
            }else{
                venda.setMesa(new Mesa(cod_mesa));
                //venda.setCliente(new Cliente(0));
                DaoVenda dav = new DaoVenda();
                dav.insereVenda(venda);
                setItensVenda(itens, cod_mesa); 
                //Criar outra
            }
        } catch (SQLException ex) {
            Logger.getLogger(DaoItensVenda.class.getName()).log(Level.SEVERE, null, ex);
        }finally{
            Fecha();
        }
          
    }
    
    
    public List<ItensVenda> getItensVendas(int cod_mesa){
        List<Produtos> produtos = new ArrayList<>();
        List<ItensVenda> itensVendas = new ArrayList<>();
        try {    
            Statement stm = connection.createStatement();
             // Vamos executar o seguinte comando SQL :  
            String SQL = "SELECT *, COUNT(*) As Quantidade FROM projetofinal.itens_venda WHERE cod_venda=(SELECT cod_venda FROM projetofinal.venda WHERE cod_mesa="+cod_mesa+" AND data_paga IS NULL) GROUP BY cod_produto";
            
            ResultSet rs = stm.executeQuery(SQL);  
            
            
            while(rs.next())  
            {  
               ItensVenda iv = new ItensVenda();
               DaoProdutos daoproduto = new DaoProdutos();
               DaoFuncionario df = new DaoFuncionario();
                // Os métodos getXXX recuperam os dados de acordo com o tipo SQL do dado:
               Produtos p = new Produtos();
               iv.setCod_Venda(rs.getInt("cod_venda"));
               iv.setProduto(daoproduto.getProdutos(rs.getInt("cod_produto")));
               iv.setQuantia(rs.getInt("Quantidade"));
               iv.setValor_unitario(rs.getDouble("valor_unitario"));
               iv.setHorario(rs.getTimestamp("pedido"));
               iv.setFuncionario(df.getFuncionario(rs.getInt("cod_funcionario")));
               itensVendas.add(iv);
            }
            
        } catch (Exception ex) {
            //Logger.getLogger(DaoMusica.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println(ex);
        } finally{
            Fecha();
        }
       
        return itensVendas;
    }
    
    public List<ItensVenda> getItensVenda(){
        List<Produtos> produtos = new ArrayList<>();
        List<ItensVenda> itensVendas = new ArrayList<>();
        
        try {    
            Statement stm = connection.createStatement();
             // Vamos executar o seguinte comando SQL :  
            String SQL = "SELECT *, COUNT(*) As Quantidade FROM projetofinal.venda, projetofinal.itens_venda WHERE data_paga IS NULL AND venda.cod_venda=itens_venda.cod_venda AND feito IS NULL GROUP BY cod_produto,cod_mesa,pedido ORDER BY pedido";
            ResultSet rs = stm.executeQuery(SQL);  
            
            
            while(rs.next())  
            {  
               ItensVenda iv = new ItensVenda();
               DaoProdutos daoproduto = new DaoProdutos();
               DaoFuncionario df = new DaoFuncionario();
                // Os métodos getXXX recuperam os dados de acordo com o tipo SQL do dado:
               Produtos p = new Produtos();
               iv.setCod_Venda(rs.getInt("cod_venda"));
               iv.setProduto(daoproduto.getProdutos(rs.getInt("cod_produto")));
               iv.setQuantia(rs.getInt("Quantidade"));
               iv.setValor_unitario(rs.getDouble("valor_unitario"));
               iv.setHorario(rs.getTimestamp("pedido"));
               iv.setFuncionario(df.getFuncionario(rs.getInt("cod_funcionario")));
               itensVendas.add(iv);
            }
            
        } catch (Exception ex) {
            //Logger.getLogger(DaoMusica.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println(ex);
        } finally{
            Fecha();
        }
        return itensVendas;
    }
    
    public ItensVenda getItemVenda(int cod_Venda, int cod_produto){

        ItensVenda iv = new ItensVenda();
        try {    
            Statement stm = connection.createStatement();
             // Vamos executar o seguinte comando SQL :  
            String SQL = "SELECT * FROM itens_venda WHERE cod_venda="+cod_Venda+" AND cod_produto="+cod_produto;
            ResultSet rs = stm.executeQuery(SQL);  
            while(rs.next())  {  
               DaoProdutos daoproduto = new DaoProdutos();
               DaoFuncionario df = new DaoFuncionario();
                // Os métodos getXXX recuperam os dados de acordo com o tipo SQL do dado:
               Produtos p = new Produtos();
               iv.setCod_Venda(rs.getInt("cod_venda"));
               iv.setProduto(daoproduto.getProdutos(rs.getInt("cod_produto")));
               iv.setQuantia(rs.getInt("quantia"));
               iv.setValor_unitario(rs.getDouble("valor_unitario"));
               iv.setHorario(rs.getTimestamp("pedido"));
               iv.setFuncionario(df.getFuncionario(rs.getInt("cod_funcionario")));
            }
        } catch (Exception ex) {
            //Logger.getLogger(DaoMusica.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println(ex);
        } finally{
            Fecha();
        }
       
        return iv;
    }
    
    public boolean setItemPronto(ItensVenda iv){
        try{
            String SQL = "UPDATE itens_venda SET feito=NOW() WHERE cod_venda=? AND cod_produto=? AND pedido=?";
            PreparedStatement stmt = Conecta().prepareStatement(SQL);

            stmt.setInt(1, iv.getCod_Venda());
            System.out.println(iv.getHorario());
            stmt.setInt(2, iv.getProduto().getCodigo());
            stmt.setTimestamp(3, iv.getHorario());
            stmt.execute();  
            stmt.close();  
            Fecha();
            return true;
        }catch(Exception e){
            System.out.println("Erro setItemPronto: "+e);
        }
        return false;
    }
}
